"""
班级管理路由模块

提供教师端班级管理相关的功能，包括：
1. 页面路由：
   - /classes: 班级管理页面，显示班级列表
2. API路由：
   - GET /api/classes: 获取班级列表，支持分页和按学院筛选
   - GET /api/classes/<class_id>: 获取单个班级信息
   - POST /api/classes: 创建新班级
   - PUT /api/classes/<class_id>: 更新班级信息
   - DELETE /api/classes/<class_id>: 删除班级

所有API路由都需要教师登录权限，使用teacher_login_required装饰器进行保护。
"""

from flask import Blueprint, render_template, request, jsonify
from flask_login import login_required, current_user
from ..models.database import db
from ..models.models import Class, College, Teacher
from .tea_auth import teacher_login_required, add_registration
from .tea_utils import get_paginated_results, get_common_data, teacher_required

# 创建蓝图，设置URL前缀为/teacher
bp = Blueprint('teacher_class', __name__, url_prefix='/teacher')

# ==================== 页面路由 ====================
@bp.route('/classes')
@teacher_login_required
@add_registration
def classes(registration):
    """
    班级管理页面路由
    
    显示所有班级信息，支持分页显示。该路由：
    1. 需要教师登录权限
    2. 自动添加教师注册信息
    3. 显示班级列表，包含学院信息
    4. 提供分页功能
    5. 包含通用数据（学院列表等）
    
    Args:
        registration: 教师注册信息，由add_registration装饰器提供
        
    Returns:
        str: 渲染后的HTML页面，包含：
            - registration: 教师注册信息
            - classes: 分页后的班级列表
            - 其他通用数据（学院列表等）
    """
    # 获取当前页码，默认为1
    page = request.args.get('page', 1, type=int)
    # 每页显示20条记录
    per_page = 20
    
    # 获取所有班级和对应的学院名称，按班级编号降序排序
    classes_query = Class.query.join(College).add_columns(College.college_name).order_by(Class.class_id.desc())
    # 分页处理
    pagination = classes_query.paginate(page=page, per_page=per_page)
    
    # 获取通用数据（如学院列表等）
    common_data = get_common_data()
    common_data.pop('classes', None)  # 移除classes键，避免重复
    
    # 渲染模板
    return render_template('teacher/classes.html',
                         registration=registration,
                         classes=pagination,
                         **common_data)

# ==================== API路由 ====================
@bp.route('/api/classes')
@teacher_login_required
def get_classes():
    """
    获取班级列表的API
    
    支持以下功能：
    1. 分页显示班级列表
    2. 按学院ID筛选班级
    3. 返回班级信息和对应的学院名称
    
    Query Parameters:
        page (int): 当前页码，默认为1
        college_id (int): 学院ID，用于筛选特定学院的班级
        
    Returns:
        dict: JSON响应，包含：
            - success: 请求是否成功
            - data: {
                'items': [
                    {
                        'class_id': int,
                        'class_name': str,
                        'college_id': int,
                        'college_name': str
                    },
                    ...
                ],
                'pagination': {
                    'total': int,      # 总记录数
                    'pages': int,      # 总页数
                    'current_page': int,  # 当前页码
                    'has_next': bool,  # 是否有下一页
                    'has_prev': bool   # 是否有上一页
                }
            }
    """
    # 获取分页参数
    page = request.args.get('page', 1, type=int)
    # 获取学院ID筛选参数
    college_id = request.args.get('college_id', type=int)
    
    # 构建查询
    query = db.session.query(
        Class,
        College.college_name
    ).join(
        College, Class.college_id == College.college_id
    ).order_by(Class.class_id.desc())
    
    # 如果指定了学院ID，添加筛选条件
    if college_id:
        query = query.filter(Class.college_id == college_id)
    
    # 获取分页结果
    result = get_paginated_results(query, page)
    return jsonify({'success': True, 'data': result})

@bp.route('/api/classes/<int:class_id>', methods=['GET'])
@teacher_login_required
def get_class(class_id):
    """
    获取单个班级信息的API
    
    根据班级ID获取详细信息，包括：
    - 班级ID
    - 班级名称
    - 所属学院ID
    
    Args:
        class_id (int): 班级ID
        
    Returns:
        dict: JSON响应，包含：
            - success: 请求是否成功
            - data: {
                'class_id': int,
                'class_name': str,
                'college_id': int
            }
            或
            - message: 错误信息（如果请求失败）
            
    Raises:
        404: 班级不存在
    """
    try:
        # 根据ID获取班级信息
        class_ = Class.query.get_or_404(class_id)
        return jsonify({
            'success': True,
            'data': {
                'class_id': class_.class_id,
                'class_name': class_.class_name,
                'college_id': class_.college_id
            }
        })
    except Exception as e:
        return jsonify({
            'success': False,
            'message': f'获取班级信息失败: {str(e)}'
        }), 400

@bp.route('/api/classes', methods=['POST'])
@teacher_login_required
def create_class():
    """
    创建新班级的API
    
    创建新的班级记录，需要提供：
    - 班级名称
    - 所属学院ID
    
    该API会：
    1. 验证必要字段
    2. 检查学院是否存在
    3. 检查班级名称是否重复
    4. 创建新班级记录
    
    Request Body:
        {
            'class_name': str,  # 班级名称
            'college_id': int   # 学院ID
        }
        
    Returns:
        dict: JSON响应，包含：
            - success: 请求是否成功
            - data: 新创建的班级信息（如果成功）
            - message: 错误信息（如果失败）
            
    Status Codes:
        201: 创建成功
        400: 请求参数错误或创建失败
    """
    # 获取请求数据
    data = request.get_json()
    if not data:
        return jsonify({'success': False, 'message': '请求体为空'}), 400
    
    # 检查必要字段
    required_fields = ['class_name', 'college_id']
    for field in required_fields:
        if field not in data:
            return jsonify({'success': False, 'message': f'缺少必要字段: {field}'}), 400
    
    try:
        # 检查学院是否存在
        college = College.query.get(data['college_id'])
        if not college:
            return jsonify({'success': False, 'message': f'学院ID {data["college_id"]} 不存在'}), 400
            
        # 检查班级名称是否已存在
        existing_class = Class.query.filter_by(class_name=data['class_name']).first()
        if existing_class:
            return jsonify({'success': False, 'message': f'班级名称 {data["class_name"]} 已存在'}), 400
            
        # 创建新班级
        class_obj = Class(
            class_name=data['class_name'],
            college_id=int(data['college_id'])
        )
        db.session.add(class_obj)
        db.session.commit()
        return jsonify({'success': True, 'data': class_obj.to_dict()}), 201
    except Exception as e:
        db.session.rollback()
        return jsonify({'success': False, 'message': f'创建班级失败: {str(e)}'}), 400

@bp.route('/api/classes/<int:class_id>', methods=['PUT'])
@teacher_login_required
def update_class(class_id):
    """
    更新班级信息的API
    
    更新指定班级的信息，可以修改：
    - 班级名称
    - 所属学院
    
    该API会：
    1. 验证班级是否存在
    2. 更新指定字段
    3. 保存更改
    
    Args:
        class_id (int): 要更新的班级ID
        
    Request Body:
        {
            'class_name': str,  # 新的班级名称（可选）
            'college_id': int   # 新的学院ID（可选）
        }
        
    Returns:
        dict: JSON响应，包含：
            - success: 请求是否成功
            - data: 更新后的班级信息（如果成功）
            - message: 错误信息（如果失败）
            
    Status Codes:
        200: 更新成功
        400: 请求参数错误或更新失败
        404: 班级不存在
    """
    # 获取要更新的班级
    class_obj = Class.query.get_or_404(class_id)
    data = request.get_json()
    if not data:
        return jsonify({'success': False, 'message': '请求体为空'}), 400
    try:
        # 更新班级名称前，检查是否重名
        if 'class_name' in data:
            existing_class = Class.query.filter_by(class_name=data['class_name']).first()
            if existing_class and existing_class.class_id != class_obj.class_id:
                return jsonify({'success': False, 'message': f'班级名称 {data["class_name"]} 已存在'}), 400
            class_obj.class_name = data['class_name']
        # 更新所属学院
        if 'college_id' in data:
            class_obj.college_id = int(data['college_id'])
        db.session.commit()
        return jsonify({'success': True, 'data': class_obj.to_dict()})
    except Exception as e:
        db.session.rollback()
        return jsonify({'success': False, 'message': str(e)}), 400

@bp.route('/api/classes/<int:class_id>', methods=['DELETE'])
@teacher_login_required
def delete_class(class_id):
    """
    删除班级的API
    
    删除指定的班级记录。该API会：
    1. 验证班级是否存在
    2. 删除班级记录
    3. 处理可能的关联数据
    
    Args:
        class_id (int): 要删除的班级ID
        
    Returns:
        dict: JSON响应，包含：
            - success: 请求是否成功
            - message: 成功或错误信息
            
    Status Codes:
        200: 删除成功
        400: 删除失败
        404: 班级不存在
        
    Note:
        删除班级可能会影响关联的学生记录，需要谨慎操作
    """
    # 获取要删除的班级
    class_obj = Class.query.get_or_404(class_id)
    try:
        # 删除班级
        db.session.delete(class_obj)
        db.session.commit()
        return jsonify({'success': True, 'message': '删除成功'})
    except Exception as e:
        db.session.rollback()
        return jsonify({'success': False, 'message': str(e)}), 400